import matplotlib.pyplot as plt 
import numpy as np 

def show(ori_func, ft, sampling_period = 5): 
    n = len(ori_func) 
    interval = sampling_period / n 
    # 绘制原始函数
    plt.subplot(2, 1, 1) 
    plt.plot(np.arange(0, sampling_period, interval), ori_func, 'black') 
    plt.xlabel('Time'), plt.ylabel('Amplitude') 

    # 绘制变换后的函数
    plt.subplot(2,1,2) 
    frequency = np.arange(n / 2) / (n * interval)
    nfft = abs(ft[range(int(n / 2))] / n ) 
    plt.plot(frequency, nfft, 'red') 
    plt.xlabel('Freq (Hz)'), plt.ylabel('Amp. Spectrum') 
    plt.show() 

# plot可以数组
def triangle_func():
    x = np.arange(0,1,.01)

    y1 = np.sin(2*np.pi*x)
    y2 = np.cos(2*np.pi*x)
    y3 = np.cos(2*np.pi*x+np.pi/2)
    y4 = np.cos(2*np.pi*x+np.pi)
    y5 = np.cos(2*np.pi*x-np.pi/2)

    plt.subplot(2, 3, 1) 
    plt.plot(x, y1, 'black') 
    plt.xlabel('sin(x)')
    plt.ylabel('Amplitude')

    plt.subplot(2, 3, 2) 
    plt.plot(x, y2, 'red') 
    plt.xlabel('cos(x)')
    plt.ylabel('Amplitude')

    plt.subplot(2, 3, 3) 
    plt.plot(x, y3, 'green') 
    plt.xlabel('cos(x+90)')
    plt.ylabel('Amplitude')

    plt.subplot(2, 3, 4) 
    plt.plot(x, y4, 'blue') 
    plt.xlabel('cos(x+180)')
    plt.ylabel('Amplitude')

    plt.subplot(2, 3, 5) 
    plt.plot(x, y5, 'blue') 
    plt.xlabel('cos(x-90)')
    plt.ylabel('Amplitude')

    plt.show() 

def linear_func():
    x = np.arange(0,1,.01)
    y1 = x
    y2 = x+2
    # y3 = 2*x+1
    # y4 = 2*(x+1)+1

    plt.plot(x, y1, 'black')
    plt.plot(x, y2, 'red')
    # plt.plot(x, y3, 'blue')
    # plt.plot(x, y4, 'green') 
    plt.xlabel('x')
    plt.ylabel('y')

    plt.show()


if __name__ == '__main__':
    #采样周期
    sampling_period = 5

    # 采样数
    N = 100

    time = np.arange(0, sampling_period, sampling_period/N)

    # 采样频率
    Fs = N / sampling_period

    x = np.sin(2 * np.pi * 1 * time) 

    #这里的信号频率不能超过采样频率/2
    # x += 2*np.sin(2 * np.pi * 20 * time)
    '''
    傅立叶原理表明：任何连续测量的时序或信号，都可以表示为不同频率的正弦波信号的无限叠加。
    而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号，
    以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。
    离散信号是在连续信号上采样得到的信号
    假设采样频率为Fs，信号频率F，采样点数为N。那么FFT之后结果就是一个为N点的复数
    假设原始信号的峰值为A，那么FFT的结果的每个点（除了第一个点直流分量之外）的模值就是A的N/2倍
    采样频率Fs，这中间被N-1个点平均分成N等份，每个点的频率依次增加。例如某点n所表示的频率为：Fn=(n-1)*Fs/N
    '''

    # N点的复数
    fft = np.fft.fft(x)

    # abs可以实现复数取模 模值就是A的N/2倍
    # amplitude = abs(fft[0:int(N/2)])*2/N
    amplitude = abs(fft)*2/N

    # 绘制原始函数
    plt.subplot(3, 1, 1) 
    plt.plot(time,x, 'black') 
    plt.xlabel('Time'), plt.ylabel('Amplitude')

    # 绘制频域图 由于对称性 实际取一半就行
    frequency = np.arange(0,Fs,Fs/N)

    # 采集频率>信号频率*2 这样才能只取一半
    # frequency = frequency[0:int(N/2)]

    # 频域图
    plt.subplot(3,1,2)
    plt.plot(frequency , amplitude, 'red') 
    plt.xlabel('Frequency'), plt.ylabel('Amplitude')

    # 相位图
    plt.subplot(3,1,3)
    phase = np.angle(fft)/np.pi*180

    plt.plot(frequency , phase, 'blue') 
    plt.xlabel('Frequency'), plt.ylabel('Phase')
    plt.show()
